# catgirl_center.py（对话中枢，统一调度所有功能）
import logging
from catgirl_tools import call_ollama, generate_rpg_file, ragflow_retrieve

# 配置调试日志
logging.basicConfig(
    level=logging.DEBUG,
    format='[调试] %(asctime)s - %(module)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)

class CatgirlAssistant:
    def __init__(self, model="Catgirl_Assistant:v2.0", rag_dataset_ids=["eb7c54a2956911f0be8636bfaf29e47a"]):
        self.model = model  # Ollama 猫娘模型名
        self.rag_datasets = rag_dataset_ids  # 知识库ID
        self.chat_history = []  # 上下文记忆（保留最近5轮）
        logging.debug(f"初始化CatgirlAssistant，模型：{model}，知识库ID：{rag_dataset_ids}")

    def _judge_intent(self, user_input):
        """意图识别：判断用户需求类型（纯聊天/生成RPG文件/查知识库）"""
        input_lower = user_input.lower().strip()
        logging.debug(f"开始意图识别，用户输入：{input_lower[:50]}...")

        scores = {
            "generate_rpg": 0,
            "retrieve_rag": 0,
            "pure_chat": 0
        }

        generate_rpg_keywords = {
            "生成": 5, "创建": 5, "制作": 4, "写一个": 4,
            "rpg配置": 6, "yml文件": 6, "物品配置": 5, "道具文件": 5,
            "rpg": 2, "yml": 2, "游戏": -10, "推荐": -8, "攻略": -8, "玩法": -6
        }

        retrieve_rag_keywords = {
            "是什么": 6, "为什么": 6, "怎么": 5, "如何": 5,
            "代码": 4, "参数": 4, "命令": 4, "颜色代码": 5, "教程": 3, "方法": 3
        }

        for word, weight in generate_rpg_keywords.items():
            if word in input_lower:
                scores["generate_rpg"] += weight
                logging.debug(f"匹配到generate_rpg关键词: {word}, 权重: {weight}, 当前得分: {scores['generate_rpg']}")

        for word, weight in retrieve_rag_keywords.items():
            if word in input_lower:
                scores["retrieve_rag"] += weight
                logging.debug(f"匹配到retrieve_rag关键词: {word}, 权重: {weight}, 当前得分: {scores['retrieve_rag']}")

        scores["pure_chat"] = 3
        if max(scores["generate_rpg"], scores["retrieve_rag"]) < 3:
            scores["pure_chat"] += 5

        logging.debug(f"意图评分结果: {scores}")

        max_score = max(scores.values())
        if max_score < 3:
            logging.debug("意图识别结果：pure_chat（得分低于阈值）")
            return "pure_chat"

        final_intent = max(scores, key=scores.get)
        logging.debug(f"意图识别结果：{final_intent}")
        return final_intent

    def _format_chat_prompt(self, user_input):
        """格式化纯聊天提示词（带上下文记忆）"""
        history_str = "\n".join([f"主人：{h['user']}\n猫娘：{h['assistant']}" for h in self.chat_history[-5:]])
        prompt = f"""
        输出内容不能有多余的空行，内容前也不需要留空
        【历史对话】
        {history_str}
        【主人现在的请求】{user_input}
        """
        logging.debug(f"生成纯聊天提示词：{prompt[:200]}...")
        return prompt

    def _format_rag_prompt(self, question, retrieved_content):
        """格式化知识库问答提示词（优先用知识库内容）"""
        prompt = f"""
        你是猫娘助手，回答主人问题要遵守规则：
        1. 优先用【知识库内容】回答，即使自己知道答案；
        2. 有知识库内容→开头说“根据知识库哦~”，并引用相关信息；
        3. 没知识库内容→开头说“知识库没找到呢，不过我知道~”，用自己的知识；
        
        【知识库内容】
        {retrieved_content}
        【主人的问题】{question}
        """
        logging.debug(f"生成知识库提示词：{prompt[:300]}...")
        return prompt

    def handle_request(self, user_input, output_dir="."):
        """处理用户请求：识别意图→调用功能→返回结果→记录历史"""
        logging.debug(f"开始处理用户请求：{user_input[:100]}...")

        # 1. 识别用户意图
        intent = self._judge_intent(user_input)

        # 2. 按意图调用对应功能
        if intent == "pure_chat":
            # 纯聊天：直接调用 Ollama 生成回应
            prompt = self._format_chat_prompt(user_input)
            response = call_ollama(prompt, self.model)
            logging.debug(f"纯聊天响应结果：{response[:200]}...")

        elif intent == "generate_rpg":
            # 生成RPG文件：调用文件生成工具，直接返回结果
            response, pure_config = generate_rpg_file(user_input, output_dir=output_dir)
            logging.debug(f"RPG生成响应：{response[:100]}...")
            logging.debug(f"提取的纯配置：{pure_config[:300]}...")

        elif intent == "retrieve_rag":
            # 查知识库：先检索→再用 Ollama 整理成猫娘语气
            retrieved = ragflow_retrieve(question=user_input, dataset_ids=self.rag_datasets)
            logging.debug(f"知识库检索结果：{retrieved[:300]}...")

            if "错误" in retrieved or "没启动" in retrieved:
                response = retrieved  # 检索出错，直接返回错误提示
                logging.debug(f"知识库检索错误：{response}")
            else:
                # 用 Ollama 把检索结果整理成自然回答
                prompt = self._format_rag_prompt(user_input, retrieved)
                response = call_ollama(prompt, self.model)
                logging.debug(f"知识库问答响应：{response[:200]}...")

        # 3. 记录聊天历史（用于上下文记忆）
        self.chat_history.append({"user": user_input, "assistant": response})
        logging.debug(f"已记录聊天历史，当前历史长度：{len(self.chat_history)}")

        # 4. 返回最终回应
        return response